#ifndef _DISP_MANAGER_H
#define _DISP_MANAGER_H

#include <pic_operation.h>

// 显示区域，包含该区域的左上角和右下角坐标,如果是图标，还有文件名
typedef struct Layout
{
    int iTopLeftX;
    int iTopLeftY;
    int iBotRightY;
    int iBOtRightX;
    char *strIconName;
} T_Layout, *PT_Layout;

// VideoMem状态
// 空闲/用于预先准备显示内容/用于当前线程
typedef enum
{
    VMS_FREE = 0,
    VMS_USED_FOR_PREPARE,
    VMS_USED_FOR_CUR,
} E_VideoMemState;

// VideoMem中内存里的图片状态
typedef enum
{
    PS_BLANK = 0,
    PS_GENERATING,
    PS_GENERATED,
} E_PicState;

typedef struct VideoMem
{
    int iID;                        // 用来表示不同页面
    int bDevFrameBuffer;            // 1：表示这个VideoMem是显示设备的缓存,0：普通缓存
    E_VideoMemState eVideoMemState; // VideoMem的状态
    E_PicState ePicState;           // Mem内存种图片的状态
    T_PixelDatas tPixelDatas;       // 用来存储图像的内存
    struct VideoMem *ptNext;
} T_VideoMem, *PT_VideoMem;

typedef struct DispOpr
{
    char *name;                                                   // 显示模块的名字
    int iXres;                                                    // x分辨率
    int iYres;                                                    // y分辨率
    int iBpp;                                                     // 一个像素用多少位表示
    int iLineWidth;                                               // 一行数据占据多少字节
    unsigned char *pucDispMem;                                    // 显存地址
    int (*DeviceInit)(void);                                      // 设备初始化函数
    int (*ShowPixel)(int iPenx, int iPenY, unsigned int dwColor); // 把指定坐标设置为某种颜色
    int (*CleanScreen)(unsigned int dwBackColor);                 // 清屏为某种颜色
    int (*ShowPage)(PT_VideoMem ptVideoMem);                      // 显示一页，数据来源于ptVideoMem
    struct DispOpr *ptNext;
} T_DispOpr, *PT_DispOpr;

int RegisterDispOpr(PT_DispOpr ptDispOpr);

void ShowDispOper(void);

int DisplayInit(void);

void SelectAndInitDefaultDispDev(char *name);

PT_DispOpr GetDefaultDispDev(void);

int GetDispResolution(int *piXres, int *piYres, int *piBpp);

int AllocVideoMem(int iNum);

PT_VideoMem GetDevVideoMem(void);

PT_VideoMem GetVideoMem(int iID, int bCur);

void PutVideoMum(PT_VideoMem ptVideoMem);

void ClearVideoMem(PT_VideoMem ptVideoMem, unsigned int dwColor);

int FBInit(void);

#endif /* _DISP_MANAGER_H */